package org.weso.acota.services;

import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Response;

import org.weso.acota.services.to.ListFeedbackResourcesTO;
import org.weso.acota.services.to.ListFeedbackTagsTO;
import org.weso.acota.services.to.ResourceTOStatus;
import org.weso.acota.services.to.SaveSuggestionsTO;

/**
 * 
 * @author chema
 */

@Path("/acota/feedback")
public class AcotaFeedbackServiceRest {

	private static AcotaFeedbackServiceFacade endpoint = new AcotaFeedbackServiceFacadeImpl();

	public AcotaFeedbackServiceRest() {

	}

	@POST
	@Path("saveSuggestions")
	@Consumes({ "application/xml", "application/json" })
	@Produces({ "text/plain", "application/xml", "application/json" })
	public ResourceTOStatus saveSuggestions(SaveSuggestionsTO suggestions) {
		try {
			endpoint.saveSuggestions(suggestions.getUser(), suggestions.getActivity(), 
					suggestions.getTaggingDate(), suggestions.getResourceUri(),
					suggestions.getResourceLabel(), suggestions.getResourceDescription(), 
					suggestions.getTags());
			return new ResourceTOStatus(Response.Status.CREATED.name());
		} catch (Exception e) {
			throw new WebApplicationException(Response.Status.BAD_REQUEST);
		}
	}
	
	@GET
	@Path("getUserTags")
	@Produces({ "text/plain", "application/xml", "application/json" })
	public ListFeedbackTagsTO getUserTags(@QueryParam("username")String username){
		try {
			ListFeedbackTagsTO tagsList = new ListFeedbackTagsTO();
			tagsList.setTags(endpoint.getUserTags(username));
			return tagsList;
		} catch (Exception e) {
			throw new WebApplicationException(Response.Status.BAD_REQUEST);
		}
	}
	
	@GET
	@Path("getDocumentTags")
	@Produces({ "text/plain", "application/xml", "application/json" })
	public ListFeedbackTagsTO getDocumentTags(@QueryParam("documentUri")String documentUri){
		try {
			ListFeedbackTagsTO tagsList = new ListFeedbackTagsTO();
			tagsList.setTags(endpoint.getDocumentTags(documentUri));
			return tagsList;
		} catch (Exception e) {
			throw new WebApplicationException(Response.Status.BAD_REQUEST);
		}
	}
	
	@GET
	@Path("getTaggedDocuments")
	@Produces({ "text/plain", "application/xml", "application/json" })
	public ListFeedbackResourcesTO getTaggedDocuments(@QueryParam("label") String label){
		try {
			ListFeedbackResourcesTO resourcesList = new ListFeedbackResourcesTO();
			resourcesList.setResources(endpoint.getTaggedDocuments(label));
			return resourcesList;
		} catch (Exception e) {
			throw new WebApplicationException(Response.Status.BAD_REQUEST);
		}
	}

	// public boolean loadResource(ResourceTO resource){
	// return endpoint.loadResource(resource);
	// }
	//
	// /* (non-Javadoc)
	// * @see
	// org.weso.acota.services.AcotaFeedbackServiceFacade2#addOntology(org.weso.acota.to.OntologyTO)
	// */
	// public boolean addOntology(OntologyTO ontology){
	// return endpoint.addOntology(ontology);
	// }
	//
	// @GET
	// @Path("listOntologies")
	// @ProduceMime({"text/plain", "application/xml", "application/json"})
	// public ListOntologiesTO listOntologies(){
	// try{
	// ListOntologiesTO result = new ListOntologiesTO();
	// result.setOntologies(endpoint.listOntologies());
	// return result;
	// }catch(Exception e){
	// throw new WebApplicationException(Response.Status.BAD_REQUEST);
	// }
	// }
	//
	// /* (non-Javadoc)
	// * @see
	// org.weso.acota.services.AcotaFeedbackServiceFacade2#getOntology(org.weso.acota.to.OntologyTO)
	// */
	// @GET
	// @Path("getOntology")
	// @ProduceMime({"text/plain", "application/xml", "application/json"})
	// public OntologyTO getOntology(@QueryParam("uri")String uri){
	// try{
	// OntologyTO ontology = new OntologyTO();
	// ontology.setUri(uri);
	// return endpoint.getOntology(ontology);
	// }catch(Exception e){
	// throw new WebApplicationException(Response.Status.NOT_FOUND);
	// }
	//
	// }
	//
	// /* (non-Javadoc)
	// * @see org.weso.acota.services.AcotaFeedbackServiceFacade2#getModel()
	// */
	// @GET
	// @Path("getModel")
	// @ProduceMime({"text/plain", "application/xml", "application/json"})
	// public ModelTO getModel(){
	// try{
	// return endpoint.getModel();
	// }catch(Exception e){
	// throw new WebApplicationException(Response.Status.BAD_REQUEST);
	// }
	// }
	//
	// /* (non-Javadoc)
	// * @see org.weso.acota.services.AcotaFeedbackServiceFacade2#newModel()
	// */
	// @GET
	// @Path("newModel")
	// @ProduceMime({"text/plain", "application/xml", "application/json"})
	// public ModelTO newModel(){
	// try{
	// endpoint.newModel();
	// return endpoint.getModel();
	// }catch(Exception e){
	// throw new WebApplicationException(Response.Status.BAD_REQUEST);
	// }
	// }
	//
	// /* (non-Javadoc)
	// * @see
	// org.weso.acota.services.AcotaFeedbackServiceFacade2#newModel(org.weso.acota.to.OntologyTO)
	// */
	// @GET
	// @Path("newModel")
	// @ProduceMime({"text/plain", "application/xml", "application/json"})
	// public ModelTO newModel(@QueryParam("uri")String uri){
	// try{
	// OntologyTO ontology = new OntologyTO();
	// ontology.setUri(uri);
	// endpoint.newModel(ontology);
	// return endpoint.getModel();
	// }catch(Exception e){
	// throw new WebApplicationException(Response.Status.BAD_REQUEST);
	// }
	// }
	//
	// //Listing methods
	// /* (non-Javadoc)
	// * @see org.weso.acota.services.AcotaFeedbackServiceFacade2#listClasses()
	// */
	// @GET
	// @Path("listClasses")
	// @ProduceMime({"text/plain", "application/xml", "application/json"})
	// public ListResourcesTO listClasses(){
	// try{
	// ListResourcesTO result = new ListResourcesTO();
	// result.setResources(endpoint.listClasses());
	// return result;
	// }catch(Exception e){
	// throw new WebApplicationException(Response.Status.BAD_REQUEST);
	// }
	// }
	//
	// /* (non-Javadoc)
	// * @see
	// org.weso.acota.services.AcotaFeedbackServiceFacade2#listProperties()
	// */
	// @GET
	// @Path("listProperties")
	// @ProduceMime({"text/plain", "application/xml", "application/json"})
	// public ListResourcesTO listProperties(){
	// try{
	// ListResourcesTO result = new ListResourcesTO();
	// result.setResources(endpoint.listProperties());
	// return result;
	// }catch(Exception e){
	// throw new WebApplicationException(Response.Status.BAD_REQUEST);
	// }
	// }
	//
	// /* (non-Javadoc)
	// * @see
	// org.weso.acota.services.AcotaFeedbackServiceFacade2#listInstances()
	// */
	// @GET
	// @Path("listInstances")
	// @ProduceMime({"text/plain", "application/xml", "application/json"})
	// public ListResourcesTO listInstances(){
	// try{
	// ListResourcesTO result = new ListResourcesTO();
	// result.setResources(endpoint.listInstances());
	// return result;
	// }catch(Exception e){
	// throw new WebApplicationException(Response.Status.BAD_REQUEST);
	// }
	// }
	//
	// /* (non-Javadoc)
	// * @see
	// org.weso.acota.services.AcotaFeedbackServiceFacade2#listInstancesOf(org.weso.acota.to.ResourceTO)
	// */
	// @GET
	// @Path("listInstancesOf")
	// @ProduceMime({"text/plain", "application/xml", "application/json"})
	// public ListResourcesTO listInstancesOf(@QueryParam("uri")String uri){
	// try{
	// ResourceTO clazz = new ResourceTO();
	// clazz.setUri(uri);
	// ListResourcesTO result = new ListResourcesTO();
	// result.setResources(endpoint.listInstancesOf(clazz));
	// return result;
	// }catch(Exception e){
	// throw new WebApplicationException(Response.Status.BAD_REQUEST);
	// }
	// }
	//
	// /* (non-Javadoc)
	// * @see
	// org.weso.acota.services.AcotaFeedbackServiceFacade2#listPropertiesOf(org.weso.acota.to.ResourceTO)
	// */
	// @GET
	// @Path("listPropertiesOf")
	// @ProduceMime({"text/plain", "application/xml", "application/json"})
	// public ListResourcesTO listPropertiesOf(@QueryParam("uri")String uri){
	// try{
	// ResourceTO clazz = new ResourceTO();
	// clazz.setUri(uri);
	// ListResourcesTO result = new ListResourcesTO();
	// result.setResources(endpoint.listPropertiesOf(clazz));
	// return result;
	// }catch(Exception e){
	// throw new WebApplicationException(Response.Status.BAD_REQUEST);
	// }
	// }
	//
	// /* (non-Javadoc)
	// * @see
	// org.weso.acota.services.AcotaFeedbackServiceFacade2#listTagsOf(org.weso.acota.to.ResourceTO)
	// */
	// @GET
	// @Path("listTagsOf")
	// @ProduceMime({"text/plain", "application/xml", "application/json"})
	// public ListTagsTO listTagsOf(@QueryParam("uri")String uri){
	// try{
	// ResourceTO clazz = new ResourceTO();
	// clazz.setUri(uri);
	// ListTagsTO result = new ListTagsTO();
	// result.setTags(endpoint.listTagsOf(clazz));
	// return result;
	// }catch(Exception e){
	// throw new WebApplicationException(Response.Status.BAD_REQUEST);
	// }
	// }
	//
	// /* (non-Javadoc)
	// * @see org.weso.acota.services.AcotaFeedbackServiceFacade2#listTags()
	// */
	// @GET
	// @Path("listTags")
	// @ProduceMime({"text/plain", "application/xml", "application/json"})
	// public ListTagsTO listTags(){
	// try{
	// ListTagsTO result = new ListTagsTO();
	// result.setTags(endpoint.listTags());
	// return result;
	// }catch(Exception e){
	// throw new WebApplicationException(Response.Status.BAD_REQUEST);
	// }
	// }
	//
	//
	// @GET
	// @Path("addClass")
	// @ProduceMime({"text/plain", "application/xml", "application/json"})
	// public ResourceTOStatus addClass(@QueryParam("uriClazz")String uriClazz,
	// @QueryParam("uriParent")String uriParent){
	// try{
	// ResourceTO clazz = new ResourceTO();
	// clazz.setUri(uriClazz);
	// ResourceTO parent = new ResourceTO();
	// parent.setUri(uriParent);
	// return (endpoint.addClass(clazz, parent)?
	// new ResourceTOStatus(Response.Status.CREATED.name(), uriClazz):
	// new ResourceTOStatus(Response.Status.BAD_REQUEST.name(), uriClazz));
	// }catch(Exception e){
	// throw new WebApplicationException(Response.Status.BAD_REQUEST);
	// }
	// }
	//
	//
	// @GET
	// @Path("addInstance")
	// @ProduceMime({"text/plain", "application/xml", "application/json"})
	// public ResourceTOStatus addInstance(@QueryParam("uriInstance")String
	// uriInstance, @QueryParam("uriClazz")String uriClazz){
	// try{
	// ResourceTO instance = new ResourceTO();
	// instance.setUri(uriInstance);
	// ResourceTO clazz = new ResourceTO();
	// clazz.setUri(uriClazz);
	// return (endpoint.addInstance(instance, clazz)?
	// new ResourceTOStatus(Response.Status.CREATED.name(), uriInstance):
	// new ResourceTOStatus(Response.Status.BAD_REQUEST.name(), uriInstance));
	// }catch(Exception e){
	// throw new WebApplicationException(Response.Status.BAD_REQUEST);
	// }
	// }
	//
	// @GET
	// @Path("addProperty")
	// @ProduceMime({"text/plain", "application/xml", "application/json"})
	// public ResourceTOStatus addProperty(@QueryParam("propertyUri")String
	// propertyUri,
	// @QueryParam("r1Uri")String r1Uri,
	// @QueryParam("r2Uri")String r2Uri){
	// try{
	// ResourceTO property = new ResourceTO();
	// property.setUri(propertyUri);
	// ResourceTO r1 = new ResourceTO();
	// r1.setUri(r1Uri);
	// ResourceTO r2 = new ResourceTO();
	// r2.setUri(r2Uri);
	// return (endpoint.addProperty(property, r1, r2)?
	// new ResourceTOStatus(Response.Status.CREATED.name(), propertyUri):
	// new ResourceTOStatus(Response.Status.BAD_REQUEST.name(), propertyUri));
	// }catch(Exception e){
	// throw new WebApplicationException(Response.Status.BAD_REQUEST);
	// }
	// }
	//
	// @GET
	// @Path("createProperty")
	// @ProduceMime({"text/plain", "application/xml", "application/json"})
	// public ResourceTOStatus createProperty(@QueryParam("uri")String uri){
	// try{
	// ResourceTO property = new ResourceTO();
	// property.setUri(uri);
	// return (endpoint.createProperty(property)?
	// new ResourceTOStatus(Response.Status.CREATED.name(), uri):
	// new ResourceTOStatus(Response.Status.BAD_REQUEST.name(), uri));
	// }catch(Exception e){
	// throw new WebApplicationException(Response.Status.BAD_REQUEST);
	// }
	// }
	//
	//
	// @GET
	// @Path("getClass")
	// @ProduceMime({"text/plain", "application/xml", "application/json"})
	// public ResourceTO getClass(@QueryParam("uri")String uri){
	// try{
	// ResourceTO clazz = new ResourceTO();
	// clazz.setUri(uri);
	// return endpoint.getClass(clazz);
	// }catch(Exception e){
	// e.printStackTrace();
	// throw new WebApplicationException(e,Response.Status.BAD_REQUEST);
	// }
	// }
	//
	//
	// @GET
	// @Path("removeClass")
	// @ProduceMime({"text/plain", "application/xml", "application/json"})
	// public ResourceTOStatus removeClass(@QueryParam("uri")String uri){
	// try{
	// ResourceTO clazz = new ResourceTO();
	// clazz.setUri(uri);
	// return (endpoint.removeClass(clazz)?
	// new ResourceTOStatus(Response.Status.ACCEPTED.name(), uri):
	// new ResourceTOStatus(Response.Status.BAD_REQUEST.name(), uri));
	// }catch(Exception e){
	// throw new WebApplicationException(Response.Status.BAD_REQUEST);
	// }
	//
	// }
	//
	//
	// @GET
	// @Path("removeInstance")
	// @ProduceMime({"text/plain", "application/xml", "application/json"})
	// public ResourceTOStatus removeInstance(@QueryParam("uri")String uri){
	// try{
	// ResourceTO instance = new ResourceTO();
	// instance.setUri(uri);
	// return (endpoint.removeInstance(instance)?
	// new ResourceTOStatus(Response.Status.ACCEPTED.name(), uri):
	// new ResourceTOStatus(Response.Status.BAD_REQUEST.name(), uri));
	// }catch(Exception e){
	// throw new WebApplicationException(Response.Status.BAD_REQUEST);
	// }
	//
	// }
	//
	//
	// @GET
	// @Path("removeProperty")
	// @ProduceMime({"text/plain", "application/xml", "application/json"})
	// public ResourceTOStatus removeProperty(@QueryParam("uri")String uri){
	// try{
	// ResourceTO property = new ResourceTO();
	// property.setUri(uri);
	// return (endpoint.removeProperty(property)?
	// new ResourceTOStatus(Response.Status.ACCEPTED.name(), uri):
	// new ResourceTOStatus(Response.Status.BAD_REQUEST.name(), uri));
	// }catch(Exception e){
	// throw new WebApplicationException(Response.Status.BAD_REQUEST);
	// }
	// }
	//
	//
	// @GET
	// @Path("removeTag")
	// @ProduceMime({"text/plain", "application/xml", "application/json"})
	// public ResourceTOStatus removeTag(@QueryParam("uri")String uri){
	// try{
	// ResourceTO removeTag = new ResourceTO();
	// removeTag.setUri(uri);
	// return (endpoint.removeTag(removeTag)?
	// new ResourceTOStatus(Response.Status.ACCEPTED.name(), uri):
	// new ResourceTOStatus(Response.Status.BAD_REQUEST.name(), uri));
	// }catch(Exception e){
	// throw new WebApplicationException(Response.Status.BAD_REQUEST);
	// }
	// }
	//
	//
	// @GET
	// @Path("getProperty")
	// @ProduceMime({"text/plain", "application/xml", "application/json"})
	// public ResourceTO getProperty(@QueryParam("uri")String uri){
	// try{
	// ResourceTO property = new ResourceTO();
	// property.setUri(uri);
	// return endpoint.getProperty(property);
	// }catch(Exception e){
	// throw new WebApplicationException(Response.Status.BAD_REQUEST);
	// }
	//
	// }
	//
	// @GET
	// @Path("getInstance")
	// @ProduceMime({"text/plain", "application/xml", "application/json"})
	// public ResourceTO getInstance(@QueryParam("uri")String uri){
	// try{
	// ResourceTO property = new ResourceTO();
	// property.setUri(uri);
	// return endpoint.getProperty(property);
	// }catch(Exception e){
	// throw new WebApplicationException(Response.Status.BAD_REQUEST);
	// }
	// }
	//
	// @GET
	// @Path("addTag")
	// @ProduceMime({"text/plain", "application/xml", "application/json"})
	// public ResourceTOStatus addTag(@QueryParam("tag")String label,
	// @QueryParam("uriResource")String uriResource,
	// @QueryParam("uriProvider")String uriProvider){
	// try{
	// ResourceTO resource = new ResourceTO();
	// resource.setUri(uriResource);
	// TagTO tag = new TagTO();
	// //tag.setTag(label); //FIXME
	// tag.setLabel(label);
	// ProviderTO provider = new ProviderTO();
	// provider.setUri(uriProvider);
	// tag.setProvider(provider );
	// return (endpoint.addTag(tag, resource)?
	// new ResourceTOStatus(Response.Status.CREATED.name(), label):
	// new ResourceTOStatus(Response.Status.BAD_REQUEST.name(), label));
	// }catch(Exception e){
	// e.printStackTrace();
	// throw new WebApplicationException(Response.Status.BAD_REQUEST);
	// }
	// }

}
